#include<iostream>
#include<vector>
#include<queue>
#include<cstring>
#include<cmath>
#include<map>
#include<set>
#include<cstdio>
#include<algorithm>
#define debug(a) cout<<#a<<"="<<a<<endl;
using namespace std;
const int maxn=2e5+1000;
typedef long long LL;
inline LL read(){LL x=0,f=1;char ch=getchar();	while (!isdigit(ch)){if (ch=='-') f=-1;ch=getchar();}while (isdigit(ch)){x=x*10+ch-48;ch=getchar();}
return x*f;}
char str[maxn];
int main(void){
   cin.tie(0);std::ios::sync_with_stdio(false);
   LL t;cin>>t;
   while(t--){
      LL a,b;cin>>a>>b;
      cin>>(str+1);LL n=strlen(str+1);
      for(LL i=1;i<=n;i++){
         if(str[i]=='0') a--;
         if(str[i]=='1') b--;
      }
      bool flag=1;
     /// debug(a);debug(b);
      for(LL i=1,j=n;i<=j;i++,j--){
          ///cout<<"i="<<i<<" "<<"j="<<j<<"\n";
//          if(i==j){
//             if(str[i]!='?') continue;
//             if(a){
//                str[i]='0';
//                a--;
//             }
//             else if(b){
//                str[i]='1';
//                b--;
//             }
//
//          }
          if(str[i]!=str[j]){
             if(str[i]=='1'&&str[j]=='0'){
                flag=0;break;
             }
             else if(str[i]=='0'&&str[j]=='1'){
                flag=0;break;
             }
             else if(str[i]=='1'&&str[j]=='?'&&b){
                b--;str[j]='1';
             }
             else if(str[i]=='0'&&str[j]=='?'&&a){
                a--;str[j]='0';
             }
             else if(str[i]=='?'&&str[j]=='0'&&a){
                a--;str[i]='0';
             }
             else if(str[i]=='?'&&str[j]=='1'&&b){
                b--;str[i]='1';
             }
//             else{
//                flag=0;break;
//             }
          }
//          else if(str[i]==str[j]&&str[i]=='?'){
//               if(a>b&&a>=2){
//                  str[i]=str[j]='0';
//                  a-=2;
//               }
//               else if(a<=b&&b>=2){
//                  str[i]=str[j]='1';
//                  b-=2;
//               }
//               else{
//                 flag=0;break;
//               }
//          }
      }
      for(LL i=1,j=n;i<=j;i++,j--){
           if(i==j){
             if(str[i]!='?') continue;
             if(a){
                str[i]='0';
                a--;
             }
             else if(b){
                str[i]='1';
                b--;
             }
          }
          else if(str[i]==str[j]&&str[i]=='?'){
               if(a>b&&a>=2){
                  str[i]=str[j]='0';
                  a-=2;
               }
               else if(a<=b&&b>=2){
                  str[i]=str[j]='1';
                  b-=2;
               }
               else{
                 flag=0;break;
               }
          }
      }
      if(a||b||flag==0){
        cout<<"-1"<<"\n";continue;
      }
      bool ok=1;
      for(LL i=1,j=n;i<=j;i++,j--){
         if(str[i]!=str[j]){
            cout<<"-1"<<"\n";
            ok=0;
            break;
         }
      }
      if(ok){
         for(LL i=1;i<=n;i++) cout<<str[i];
         cout<<"\n";
      }
   }
   return 0;
}
